package com.rs.data.model;

import com.rs.utils.XMLParserUtil;
import lombok.Data;

import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;

@Data
@XmlRootElement(name = "form")
public class PadForm {

    /**
     * 接口协议版本，目前固定为V1.0.0
     */
    private String version;

    /**
     * 本次传输任务的主题
     */
    private String title;

    /**
     * 本次传输任务的M级 SEC02:JM SEC03:MM SEC04:内部 SEC05:非M
     */
    private String secLevel;

    /**
     * 交换模式。保留字段，当前未使用
     */
    private String exchMode;

    /**
     * 优先级 PRI01:高 PRI02:中 PRI03:低
     */
    private String priority;

    /**
     * 发送者接入应用id。用以区分不同的发送应用
     */
    private String senderAccessAppId;

    /**
     * 发送者接入应用名。用以区分不同的发送应用
     */
    private String senderAccessAppName;

    /**
     * 发送者id
     */
    private String senderId;

    /**
     * 发送者名称
     */
    private String senderName;

    /**
     * 保留字段，当前未使用
     */
    private String ext;

    /**
     * 接收者列表
     */
    private Receivers receivers;

    /**
     * 传输文件信息列表，包括文件个数、校验信息等
     */
    private Files files;

    /**
     * 接收者列表
     */
    @Data
    public static class Receivers {
        private List<PadReceiverInfo> receiverInfo;

        public Receivers() {
        }

        public Receivers(List<PadReceiverInfo> list) {
            this.receiverInfo = list;
        }
    }

    @Data
    public static class Files {

        /**
         * 包含的文件个数
         */
        private String totalNum;

        /**
         * 文件传输时分片固定大小，单位：字节
         * 文件（包括附件和正文）在传输时，只要超过该设置尺寸时，均需要进行分片传输。而分片除了最后一个，大小都应等于该固定值
         */
        private long fragmentSize;

        /**
         * 传输文件信息，此部分可以有1个到多个，每一个文件用一个fileInfo标签描述
         */
        private List<FileInfo> fileInfo = new ArrayList<>();
    }

    @Data
    public static class FileInfo {

        /**
         * 文件类型，0:附件 1:正文
         */
        private int fileType;

        /**
         * 文件内容（原文）大小，单位：字节
         */
        private long fileSize;

        /**
         * 文件名
         */
        private String fileName;

        /**
         * 文件内容（原文）md5校验值
         */
        private String fileChecksum;

        public FileInfo() {
        }

        /**
         * @param fileType     文件类型，0:附件 1:正文
         * @param fileSize     文件内容（原文）大小，单位：字节
         * @param fileName     文件名
         * @param fileChecksum 文件内容（原文）md5校验值
         */
        public FileInfo(int fileType, long fileSize, String fileName, String fileChecksum) {
            this.fileType = fileType;
            this.fileSize = fileSize;
            this.fileName = fileName;
            this.fileChecksum = fileChecksum;
        }
    }

    public static void main(String[] args) {
        PadForm form = new PadForm();
        form.setVersion("V1.0.0");
        form.setTitle("测试2022-05-23 10:06:06");
        form.setSenderAccessAppId("appid");
        form.setSenderAccessAppName("appName");
        PadReceiverInfo info = new PadReceiverInfo();
        info.setReceiverAccessAppId("receiveAppId");
        info.setReceiverAccessAppName("receiveAppName");
        info.setReceiverId("Id");
        info.setReceiverName("Name");
        List<PadReceiverInfo> list = new ArrayList<>();
        list.add(info);
        form.setReceivers(new Receivers(list));
        Files files = new Files();
        files.setTotalNum("1");
        files.setFragmentSize(20000000);
        files.getFileInfo().add(new FileInfo(1, 2000, "1.docx", ""));
        form.setFiles(files);
        System.out.println(XMLParserUtil.marshal(form));
    }
}
